package products_;

/**
 * @Author 汤舒青
 * @Version 1.0
 */

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.List;
import java.util.Scanner;

/**
 * product为商品信息节点，discount表示是否折扣，如果是折扣商品，打七折；
 * factoryaddr是工厂地址；
 * itemno为商品编号，name为商品名称，price为商品单价，unit是计价单位，stockcount是库存量。
 * 1：读取products.xml中的商品信息，输出。
 * 2：查找商品信息：根据输入的商品号，输出对应的商品信息。
 * 3：修改products.xml，输入商品编号（itemno）和数量，修改对应商品的数量（stockcount）；没有找到商品号，给出提示。
 * <p>
 * 4：以products.xml作为基础，实现客户购买的方法，输入商品号和购买数量，计算应付金额，如果是折扣商品，打七折；如果购买数量超过库存量，给出提示；商品不存在，给出提示；购买成功，扣除相应的数量。最后输出应付款的金额。
 * <p>
 * 5:增加新商品的功能，要求商品号和商品名称都不能重复（即不能和已经存在的重复）
 */

public class Product {
    private static final Scanner input = new Scanner(System.in);
    public final static String FILE_PATH="D:\\IdeaProjects\\javau1\\java网络编程\\src\\products_\\products.xml";

    public static Document getDoc(){
        SAXReader reader = new SAXReader();
        Document doc = null;
        try {
            doc = reader.read(new File(FILE_PATH));
            return doc;

        } catch (DocumentException e) {
            e.printStackTrace();
        }
        return null;
    }

    //读取文件
    public static void readFile() {
//        SAXReader reader = new SAXReader();
//        Document doc = null;
//        try {
//            doc = reader.read(Product.class.getResourceAsStream("products.xml"));
//
//        } catch (DocumentException e) {
//            e.printStackTrace();
//        }
        Document doc = getDoc();
        //获取根节点
        Element root = doc.getRootElement();
       // System.out.println("根节点的名称" + root.getName() + "，value" + root.getTextTrim());
        List<Node> list = root.selectNodes("//product[@discount][@factoryaddr]");
        System.out.println("安徽百大合家福1店");
        System.out.println("商品是否折扣\t\t商品产地\t\t商品编号\t\t商品姓名\t\t商品价格\t\t商品数量\t\t计量单位\t\t");
        list.forEach(node -> {
            if (node instanceof Element) {
                Element element = (Element) node;
                String discount = element.attributeValue("discount");
                String factoryaddr = element.attributeValue("factoryaddr");
                String itemno = element.elementTextTrim("itemno");
                String name = element.elementTextTrim("name");
                Double price = Double.parseDouble(element.elementTextTrim("price"));
                Integer stockcount = Integer.parseInt(element.elementTextTrim("stockcount"));
                String unit = element.elementTextTrim("unit");
                System.out.println((Boolean.valueOf(discount) ? "有折扣" : "无折扣") + "\t\t\t" + factoryaddr + "\t\t\t" + itemno + "\t\t" + name + "\t\t\t" + price + "\t\t\t" + stockcount + "\t\t\t\t" + unit);
            }
        });

    }

    //查找商品信息：根据输入的商品号，输出对应的商品信息。
    public static void find(String no) {
//        SAXReader reader = new SAXReader();
//        Document doc = null;
//        try {
//            doc = reader.read(Product.class.getResourceAsStream("products.xml"));
//
//        } catch (DocumentException e) {
//            e.printStackTrace();
//        }
        Document doc = getDoc();
        //获取根节点
        //  Element root = doc.getRootElement();
        // System.out.println(root);
        List<Node> list = doc.selectNodes("//product[itemno=" + no + "]");
        if (list.size() == 0) {
            System.out.println("没有");
        }
        System.out.println("商品是否折扣\t\t商品产地\t\t商品编号\t\t商品姓名\t\t商品价格\t\t商品数量\t\t计量单位\t\t");
        Element e = (Element) list.get(0);
        String discount = e.attributeValue("discount");
        String factoryaddr = e.attributeValue("factoryaddr");
        String itemno = e.elementTextTrim("itemno");
        String name = e.elementTextTrim("name");
        Double price = Double.parseDouble(e.elementTextTrim("price"));
        Integer stockcount = Integer.parseInt(e.elementTextTrim("stockcount"));
        String unit = e.elementTextTrim("unit");
        System.out.println((Boolean.valueOf(discount) ? "有折扣" : "无折扣") + "\t\t\t" + factoryaddr + "\t\t\t" + itemno + "\t\t" + name + "\t\t\t" + price + "\t\t\t" + stockcount + "\t\t\t\t" + unit);
    }

    /**
     * 修改products.xml，
     * 输入商品编号（itemno）和数量，修改对应商品的数量（stockcount）；没有找到商品号，给出提示。
     * @param no
     * @param count
     */

    public static void recompose(String no, int count) {
//        SAXReader reader = new SAXReader();
//        Document doc = null;
//        try {
//            doc = reader.read(Product.class.getResourceAsStream("products.xml"));
//
//        } catch (DocumentException e) {
//            e.printStackTrace();
//        }
        Document doc = getDoc();

        List list = doc.selectNodes("//product[itemno=" + no + "]");
        if (list.size() == 0) {
            System.out.println("没有");
        }
        Element e = (Element) list.get(0);
        e.selectSingleNode("stockcount").setText(String.valueOf(count));
        try {
            OutputFormat format = OutputFormat.createPrettyPrint();
            format.setEncoding("utf-8");
            XMLWriter xw = new XMLWriter(new FileWriter(FILE_PATH), format);
            xw.write(doc);
            xw.flush();
            xw.close();
        } catch (IOException ee) {
            ee.printStackTrace();
        }
    }

    //以products.xml作为基础，实现客户购买的方法，输入商品号和购买数量，
    // 计算应付金额，如果是折扣商品，打七折；如果购买数量超过库存量，给出提示；
    // 商品不存在，给出提示；购买成功，扣除相应的数量。最后输出应付款的金额。
    public static void buy(String no, int count) {
//        SAXReader reader = new SAXReader();
//        Document doc = null;
//        try {
//            doc = reader.read(Product.class.getResourceAsStream("products.xml"));
//
//        } catch (DocumentException e) {
//            e.printStackTrace();
//        }
        Document doc = getDoc();
        List<Node> list = doc.selectNodes("//product[itemno=" + no + "]");
        if (list.size() == 0) {
            System.out.println("无该商品");
            return;
        }
        Element element = (Element) list.get(0);
        if (Integer.parseInt(element.elementTextTrim("stockcount")) >= count) {
         Boolean flag= Boolean.valueOf(element.attributeValue("discount"));
            if (flag) {
                System.out.println("购买商品需要价格为" + Double.parseDouble(element.elementTextTrim("price")) * count * 0.7);
            } else /*if (element.attributeValue("discount").equals("无折扣")) */ {
                System.out.println("购买商品需要价格为" + Double.parseDouble(element.elementTextTrim("price"))*count);
            }
        } else {
            System.out.println("数量不够");
            return;
        }
//        if (Integer.parseInt(element.elementTextTrim("stockcount")) < count) {
//            System.out.println("数量不够，无法购买");
//        } else {
//            System.out.println("购买成功，购买数量是" + count);
//        }
        element.selectSingleNode("stockcount").setText(String.valueOf(Integer.parseInt(element.elementTextTrim("stockcount")) - count));
        OutputFormat format = OutputFormat.createPrettyPrint();
        format.setEncoding("UTF-8");
        try {
            XMLWriter writer = new XMLWriter(new FileWriter(FILE_PATH), format);
            writer.write(doc);
            writer.close();
        } catch (IOException e) {
            e.printStackTrace();
        }


    }

    /**
     * product为商品信息节点，discount表示是否折扣，如果是折扣商品，打七折；
     *  * factoryaddr是工厂地址；
     *  * itemno为商品编号，name为商品名称，price为商品单价，unit是计价单位，stockcount是库存量。
     */
    public static void add(String discount,String add,String item ,String name,double price,int count,String unit){
//        SAXReader reader = new SAXReader();
//        Document doc = null;
//        try {
//            doc = reader.read(Product.class.getResourceAsStream("products.xml"));
//
//        } catch (DocumentException e) {
//            e.printStackTrace();
//        }
        Document doc = getDoc();
        List<Node> list = doc.selectNodes("//product");
        for (Node node : list) {
            Element element =(Element) node;
            String s = element.elementTextTrim("itemno");
            String name1 = element.elementTextTrim("name");
            if (s.equals(item)){
                System.out.println("输入的商品编号相同，请检查后输入");
                return;
            }
            if (name1.equals(name)){
                System.out.println("输入的商品姓名一致，请检查后输入");
                return;
            }
        }
        Element root = doc.getRootElement();
        Element product = root.addElement("product");
        product.addAttribute("discount",String.valueOf(discount));
        product.addAttribute("factoryaddr",String.valueOf(add));
        product.addElement("itemno").setText(item);
        product.addElement("name").setText(name);
        product.addElement("price").setText(String.valueOf(price));
        product.addElement("stockcount").setText(String.valueOf(count));
        product.addElement("unit").setText(unit);
        OutputFormat print = OutputFormat.createPrettyPrint();
        print.setEncoding("UTF-8");
        try {
            XMLWriter xmlWriter = new XMLWriter(new FileWriter(FILE_PATH), print);
        xmlWriter.write(doc);
        xmlWriter.flush();
        xmlWriter.close();
            System.out.println("商品已入库");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    public static void main(String[] args) {

        while (true){
            System.out.println("1：输入商品的信息\t 2:查找商品\t 3：修改商品数量\t 4：购买商品 5:\t 添加商品\t 0：退出");
            System.out.println("输入选择");
            int chioce=input.nextInt();
            switch (chioce){
                case 1:
                    readFile();
                    break;
                case 2:
                    System.out.println("请输入你要查找的商品编号");
                    String no=input.next();
                    find(no);
                    break;
                case 3:
                    System.out.println("请输入您要修改的商品编号");
                    String no2=input.next();
                    System.out.println("请输入您要修改的商品数量");
                    int num=input.nextInt();
                    recompose(no2,num);
                    break;
                case 4:
                    System.out.println("请输入您要购买的商品编号");
                    String no3=input.next();
                    System.out.println("请输入您要购买的商品数量");
                    int num1=input.nextInt();
                    buy(no3,num1);
                    break;
                case 5:
                    System.out.println("请输入您要添加的商品折扣状态（true/false）");
                    String a=input.next();
                    System.out.println("请输入您要添加商品的产地");
                    String b=input.next();
                    System.out.println("请输入商品的编号");
                    String c=input.next();
                    System.out.println("请输入商品名称");
                    String d=input.next();
                    System.out.println("请输入商品价格");
                    double e=input.nextDouble();
                    System.out.println("请输入商品数量");
                    int f=input.nextInt();
                    System.out.println("请输入商品的计量单位");
                    String n=input.next();
                    add(a,b,c,d,e,f,n);
                    break;
                    default:
                        break;
            } if (chioce==0){
                System.out.println("退出系统");
                break;
            }
        }

        //readFile();
        //  find("2951");
        // recompose("2949", 59);
       // buy("2949", 1);

//        add("true","芜湖","2854","原子弹",52.6,750,"颗");

    }
}
